package net.luohuasheng.bee.proxy.mybatis.dao;


import net.luohuasheng.bee.proxy.mybatis.executor.criteria.Criteria;
import org.apache.ibatis.annotations.Param;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

/**
 * 增删改查公共方法
 *
 * @param <T> 泛型对象
 * @author panda
 */
public interface BasicCrudDao<T> extends BasicReadDao<T> {


    /**
     * 插入一条记录
     *
     * @param entity 实体对象
     * @return 修改的数据条数
     */
    int insert(T entity);

    /**
     * 插入一条记录，Bean中null的字段不会被插入
     *
     * @param entity 实体对象
     * @return 修改的数据条数
     */
    int insertSelective(T entity);


    /**
     * 插入或更新一条记录
     *
     * @param entity  实体对象
     * @param uniques 唯一约束实体属性
     * @return 修改的数据条数
     */
    int saveOrUpdateByUniques(T entity, @Param("uniques") Serializable... uniques);

    /**
     * 插入或更新一条记录
     *
     * @param entity 实体对象
     * @return 修改的数据条数
     */
    int saveOrUpdateById(T entity);

    /**
     * 根据主键更新对象
     *
     * @param data 待更新数据
     * @param pks  主键
     * @return 修改的数据条数
     */
    int updateById(@Param("data") Map<String, Object> data, @Param("pks") Serializable... pks);

    /**
     * 根据条件更新对象
     *
     * @param data     待更新数据
     * @param criteria 更新条件
     * @return 修改的数据条数
     */
    int updateEntity(@Param("data") Map<String, Object> data, Criteria criteria);

    /**
     * 根据主键更新对象
     *
     * @param entity 实体对象
     * @return 修改的数据条数
     */
    int updateEntityById(T entity);

    /**
     * 根据主键删除数据
     *
     * @param pks 主键
     * @return 删除的数据条数
     */
    int deleteById(@Param("pks") Serializable... pks);

    /**
     * 根据条件删除数据
     *
     * @param criteria 删除条件
     * @return 删除的数据条数
     */
    int deleteEntity(Criteria criteria);

    /**
     * 批量新增数据
     *
     * @param list 待新增的数据
     * @return 新增的条数
     */
    int insertBatch(List<T> list);


}
